import type { FormRules } from "element-plus";

// 公司名称验证规则
const companyNameRules = [
  {
    required: true,
    message: "请输入公司名称",
    trigger: "blur"
  },
  {
    min: 2,
    max: 100,
    message: "公司名称长度应在2-100个字符之间",
    trigger: "blur"
  },
  {
    pattern: /^[\u4e00-\u9fa5a-zA-Z0-9\s\-\(\)（）]+$/,
    message: "公司名称只能包含中文、英文、数字、空格、连字符和括号",
    trigger: "blur"
  }
];

// 英文公司名称验证规则
const companyNameEnRules = [
  {
    required: true,
    message: "请输入英文公司名称",
    trigger: "blur"
  },
  {
    min: 2,
    max: 100,
    message: "英文公司名称长度应在2-100个字符之间",
    trigger: "blur"
  },
  {
    pattern: /^[a-zA-Z0-9\s\-\(\)&.,]+$/,
    message: "英文公司名称只能包含英文、数字、空格、连字符、括号、&、.和逗号",
    trigger: "blur"
  }
];

// 地址验证规则
const addressRules = [
  {
    required: true,
    message: "请输入地址",
    trigger: "blur"
  },
  {
    min: 5,
    max: 200,
    message: "地址长度应在5-200个字符之间",
    trigger: "blur"
  },
  {
    pattern: /^[\u4e00-\u9fa5a-zA-Z0-9\s\-\(）（）.,，。]+$/,
    message: "地址只能包含中文、英文、数字、空格、连字符、括号、逗号和句号",
    trigger: "blur"
  }
];

// 英文地址验证规则
const addressEnRules = [
  {
    required: true,
    message: "请输入英文地址",
    trigger: "blur"
  },
  {
    min: 5,
    max: 200,
    message: "英文地址长度应在5-200个字符之间",
    trigger: "blur"
  },
  {
    pattern: /^[a-zA-Z0-9\s\-\(\)&.,]+$/,
    message: "英文地址只能包含英文、数字、空格、连字符、括号、&、.和逗号",
    trigger: "blur"
  }
];

// 区号验证规则
const areaCodeRules = [
  {
    required: false,
    message: "请输入区号",
    trigger: "blur"
  },
  {
    pattern: /^[0-9]{2,4}$/,
    message: "区号应为2-4位数字",
    trigger: "blur"
  }
];

// 主号码验证规则
const mainNumberRules = [
  {
    required: true,
    message: "请输入电话号码",
    trigger: "blur"
  },
  {
    pattern: /^[0-9]{7,11}$/,
    message: "电话号码应为7-11位数字",
    trigger: "blur"
  }
];

// 分机号验证规则（可选）
const extensionRules = [
  {
    pattern: /^[0-9]{1,6}$/,
    message: "分机号应为1-6位数字",
    trigger: "blur"
  }
];

// Logo验证规则
const logoRules = [
  {
    required: true,
    message: "请上传Logo",
    trigger: "change"
  }
];

// 导出验证规则
export const exhibitionFormRules: FormRules = {
  company_name_cn: companyNameRules,
  company_name_en: companyNameEnRules,
  addres_cn: addressRules,
  addres_en: addressEnRules,
  logo: logoRules
};

// 电话号码分段验证规则
export const phoneValidationRules = {
  areaCode: areaCodeRules,
  mainNumber: mainNumberRules,
  extension: extensionRules
};

// 自定义验证函数
export const validatePhoneNumber = (phoneSegments: any) => {
  const errors: string[] = [];

  // 区号可选，但如果填写了就要验证格式
  if (phoneSegments.areaCode && !/^[0-9]{2,4}$/.test(phoneSegments.areaCode)) {
    errors.push("区号应为2-4位数字");
  }

  if (!phoneSegments.mainNumber) {
    errors.push("请输入电话号码");
  } else if (!/^[0-9]{7,11}$/.test(phoneSegments.mainNumber)) {
    errors.push("电话号码应为7-11位数字");
  }

  if (phoneSegments.extension && !/^[0-9]{1,6}$/.test(phoneSegments.extension)) {
    errors.push("分机号应为1-6位数字");
  }

  return {
    isValid: errors.length === 0,
    errors
  };
};

// 验证Logo文件
export const validateLogoFile = (file: File) => {
  const errors: string[] = [];

  // 检查文件类型
  const allowedTypes = ['image/jpeg', 'image/jpg', 'image/png'];
  if (!allowedTypes.includes(file.type)) {
    errors.push("Logo文件格式必须是JPG、PNG或JPEG");
  }

  // 检查文件大小（10MB）
  const maxSize = 10 * 1024 * 1024;
  if (file.size > maxSize) {
    errors.push("Logo文件大小不能超过10MB");
  }

  // 检查文件名长度
  if (file.name.length > 100) {
    errors.push("Logo文件名长度不能超过100个字符");
  }

  return {
    isValid: errors.length === 0,
    errors
  };
};

// 表单整体验证
export const validateForm = (form: any, phoneSegments: any) => {
  const errors: string[] = [];

  // 验证必填字段
  if (!form.company_name_cn?.trim()) {
    errors.push("请输入公司名称(中)");
  }

  if (!form.company_name_en?.trim()) {
    errors.push("请输入公司名称(英)");
  }

  if (!form.addres_cn?.trim()) {
    errors.push("请输入地址(中)");
  }

  if (!form.addres_en?.trim()) {
    errors.push("请输入地址(英)");
  }

  if (!form.logo?.trim()) {
    errors.push("请上传Logo");
  }

  // 验证电话号码
  const phoneValidation = validatePhoneNumber(phoneSegments);
  if (!phoneValidation.isValid) {
    errors.push(...phoneValidation.errors);
  }

  return {
    isValid: errors.length === 0,
    errors
  };
};
